package com.qingcloud.adminbackend.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qingcloud.adminbackend.controller.open.param.ChangePwdParam;
import com.qingcloud.adminbackend.controller.open.param.GridUserParam;
import com.qingcloud.adminbackend.entity.user.*;
import com.qingcloud.adminbackend.base.AjaxResult;
import com.qingcloud.adminbackend.base.LoginRequest;
import com.qingcloud.adminbackend.entity.domain.DomainTreeVO;
import com.qingcloud.adminbackend.entity.stationgroup.SysOrgStationGroup;
import com.qingcloud.adminbackend.entity.user.*;
import com.qingcloud.adminbackend.entity.userdomain.UserDomainDTO;
import com.qingcloud.adminbackend.entity.userrole.UserRoles;
import com.qingcloud.adminbackend.pojo.cloud.CloudApiRequest;
import com.qingcloud.base.remote.pojo.LoginUserDTO;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author luozehua
 * @since 2018-11-19
 */
public interface ISysUserService extends IService<SysUser> {

    SysUser getUserDetails(String userId);

    /**
     * 添加空气用户
     *
     * @param user
     */
    String addAirUser(AddAirUserBO user, String createId);

    /**
     * 添加蛙鸣用户
     *
     * @param user
     */
    Integer addWmUser(AddWmUserBO user,
                      Map<String, Collection<String>> userAuthFunctions,
                      List<String> orgTreeByLoginUser,
                      Set<String> orders,
                      Set<String> oamOrders,
                      String createId);

    /**
     * 修改空气用户
     *
     * @param user
     */
    Integer updateAirUser(AddAirUserBO user, List<String> mgrList,
                          List<String> mgrStationGroup,
                          List<String> userAuthFunctions, String userId, Boolean isAdmin);

    /**
     * 修改蛙鸣用户
     *
     * @param user
     */
    Integer updateWmUser(AddWmUserBO user, Set<String> orders,
                         List<String> orgTreeByLoginUser,
                         Set<String> oamOrders);

    /**
     * 根据用户Ids删除用户
     *
     * @param ids
     * @return
     */
    AjaxResult deleteUserByIds(List<String> ids, String userType, Boolean isAdmin, String userId);

    /**
     * 查找健康空气用户
     *
     * @param sysUser
     * @param userId
     * @param isAdmin
     * @return
     */
    IPage<AirUserVO> findPageAirUser(AirUserBo sysUser, String userId, Boolean isAdmin);

    /**
     * 根据用户名称查询用户
     *
     * @param userName
     * @return
     */
    SysUser findByUserNameOrPhone(String userName);

    /**
     * 密码重置
     *
     * @param user
     * @return
     */
    Integer resetPwd(UserBO user);

    /**
     * 获取蛙鸣用户的授权关系
     *
     * @param wmAuth
     * @return
     */
    JSONObject getWmUserAuth(WmAuth wmAuth, String createId, Boolean isAdmin);

    /**
     * 删除指定蛙鸣用户的授权关系
     *
     * @param userId
     */
    void deleteWmUserAuth(String userId, List<String> roleIds,
                          Set<String> orders,
                          List<String> orgTreeByLoginUser,
                          Set<String> oamOrders);

    /**
     * 蛙鸣用户授权
     *
     * @param user
     * @param createId
     */
    void reWmAuth(AddWmUserBO user, Map<String, Collection<String>> userAuthFunctions,
                  List<String> orgTreeByLoginUser,
                  Set<String> orders,
                  Set<String> oamOrders, String createId, List<String> stationGroupIds);

    /**
     * 健康用户授权
     *
     * @param airAuth
     * @param createId
     */
    void airUserAuth(AirAuthBO airAuth, List<String> mgrList,
                     List<String> mgrStationGroup,
                     List<String> userAuthFunctions,
                     String createId, Boolean isAdmin);

    /**
     * 批量导入用户
     *
     * @param excelFile
     * @param userId
     * @param isAdmin
     * @return
     */
    AjaxResult importUser(MultipartFile excelFile, String userId, Boolean isAdmin);

    /**
     * 检测登录名是否已经注册
     *
     * @param userName
     * @return
     */
    Boolean userNameExist(String userName);

    /**
     * 检测手机号是否已经注册
     *
     * @param mobileno
     * @return
     */
    Boolean mobilenoExist(String mobileno);

    Boolean emailExist(String email);

    /**
     * 修改用户的用户组
     *
     * @param userBO
     * @param createId
     * @return
     */
    int updateUser2UserGroup(UserBO userBO, String createId);

    /**
     * 根据客户ID 查询用户
     *
     * @param orgId
     * @return
     */
    List<SysUser> getUserByOrgId(String orgId);

    /**
     * 获取用户默认的用户名
     *
     * @return
     */
    String defaultUserName();

    /**
     * 获取健康用户的权限
     *
     * @param userId
     * @return
     */
    JSONObject getAirUserAuth(String userId);

    /**
     * 一步步检测给用户授权设备组的功能
     *
     * @param stationGroupBO
     * @return
     */
    List<SysOrgStationGroup> checkStaionGroupAuth(StationGroupBO stationGroupBO);

    /**
     * 指定用户是否是完全管理员
     *
     * @param userId
     * @return
     */
    Boolean hasAllAuth2LoginUser(String userId, boolean admin);

    /**
     * 更新登录状态
     * 0未激活 1登录中 2退出 3锁定 4禁用
     *
     * @param userId
     * @param status
     */
    void updateLoginStatus(String userId, String status);

    void loguot(String userId);

    Boolean isFullAdmin(String userId);

    UserRoles getAllRoles(String userId);

    Integer getUserRole(String updateUserId);

    void deleteOrgMgr(String updateUserId, String roleId);

    void deleteStationGroup(String updateUserId, String roleId);

    /**
     * 功能描述: 用户登录
     *
     * @param:
     * @return:
     * @auther: Destiny
     * @date: 2021/1/25 上午11:50
     */
    LoginUserDTO loginAllPlatforms(LoginRequest request);

    /**
     * 按照登录名和姓名模糊查询所有用户
     *
     * @param name 模糊查询的名称
     * @return 用户列表
     */
    List<SimpleUserDTO> findUserLike(String name);


    /**
     *
     * @param name
     * @return
     */
    LoginUserDTO getUserByName(String name);

    /**
     * 通过用户ID列表批量查询用户信息
     *
     * @param idList 用户ID列表
     * @return 用户信息列表
     */
    List<SimpleUserDTO> findByIdList(Collection<String> idList);

    /**
     * 修改用户密码
     *
     * @param param
     * @return
     */
    AjaxResult changePassword(ChangePwdParam param);

    String resetSelfPassword(ChangePwdParam param);

    /**
     * 按用户账号查询用户信息
     */
    List<SimpleUserDTO> findUsernameList(Collection<String> userNameList);

    /**
     * 查询客户下的用户
     */
    List<SimpleUserDTO> findByOrgId(String orgId);

    /**
     * 查询网格员
     */
    List<GridUserDTO> findGridUser(GridUserParam gridUserParam);

    /**
     * 查询用户分配的区域
     */
    List<UserDomainDTO> findUserDomain(String userId);

    public List<UserRoleBo> findRoleByUser(String userId);
    /**
     * 查询用户身份信息
     */
    UserFlagDTO findUserFlag(String userId);

    /**
     * 保存 修改 网格化用户信息数据
     */
    AjaxResult saveGridUserData(UserGridDataDTO dto);

    /**
     *  查询 网格化用户信息数据
     */
    UserGridDataDTO selectGridUserData(String userId);

    /**
     * 查询用户 可用区域  树接结构
     */
    List<DomainTreeVO> selectUserDomainTree(String userId);

    /**
     * 查询用户可用区域 列表结构
     */
    List<UserDomainDTO> selectUserDomainList(String userId);

    /**
     * 根据用户Id获取用户信息
     * @param userId
     * @return
     */
    LoginUserDTO getUserByUserId(String userId);

    /**
     * 云平台注册用户
     */
    String register(CloudApiRequest.RegisterParam param, String orgId, String orderId);

    /**
     * 云平台找回密码
     */
    String findPassword(String email, String password);

    /**
     * 云平台修改用户信息
     */
    void cloudModifyUser(String userId, String fullName, String phone);


    boolean isAdmin(String userId);

    void updateLoginInfoById(String userId);

    /**
     * 保存用户头像信息
     */
    void saveAvatar(UserAvatarBO bo);

    /**
     * 查询用户团队信息
     */
    UserTeamBO findTeamInfo(String userId);

}
